use sea_orm::entity::prelude::*;
use sqlx::types::chrono;

#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "t_blog")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub blog_id: i32,
    pub title: String,
    pub content: String,
    #[sea_orm(column_type = "DateTime", nullable)]
    pub created_at: Option<chrono::NaiveDateTime>,
    #[sea_orm(column_type = "DateTime", nullable)]
    pub updated_at: Option<chrono::NaiveDateTime>,
    pub user_id: String,
}

/// 一个用户可以有多个博客，但是每个博客只能有一个作者，所以用户和博客之间属于一对多的关系。
/// 参考 sea-orm 官方网站： https://www.sea-ql.org/SeaORM/docs/relation/one-to-many
// Relation 指定与其他实体的关系
// 此处相当与实体组合，表示本实体模型依赖一个外部实体模型Fruit，其中has_many表示以来的子模型位置，super表示当前模型所在目录
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
    // 这个注解表明，当前实体隶属于 User 实体，当前实例的 user_id 字段对应 User 实体的 UserId 字段，两者之间是一对一关系。
    /// 参考 sea-orm 官方网站： https://www.sea-ql.org/SeaORM/docs/relation/one-to-one
    #[sea_orm(
        belongs_to = "super::user::Entity",
        from = "Column::UserId",
        to = "super::user::Column::UserId"
    )]
    User
}

// ActiveModel 具有其对应模型的所有属性，但所有属性都包装在 ActiveValue 中。
// ActiveModel 上不同操作的钩子。例如，可以执行自定义验证逻辑或触发副作用。在事务中，您甚至可以在操作完成后中止操作，从而防止其保存到数据库中。相当与Java中的Service或者Mapper接口实现类
impl ActiveModelBehavior for ActiveModel {}

// 不要删除关系枚举（Relation）或活动模型行为（ActiveModelBehavior） impl 块，即使它们是空的。
